gusucode.com > 阵列信号处理书的源码 > MATALB 程序/15 四元数MUSIC的MATLAB程序/main.m
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %**程序名字:四元数MUSIC仿真的主程序用于谐波估计 %**作者: 汪飞 %** {(1+i(rou)exp[j(fai)])*exp[-j(thita)]}*beita*exp[j(alfa)] %** 此处假设beita=1,alfa=0 % EMAIL:wangxiaoxian@nuaa.edu.cn, zhangxiaofei@nuaa.edu.cn %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear all; close all clc; K = 0; for Kk = 1:1 N = 3; % 构造信号 thita_1 = 0.85; rou_1 = 3; fai_1 = 0.27; beita_1 = 1; alfa_1 = 0; SourSig = SteerVector(N, thita_1, rou_1, fai_1, beita_1, alfa_1); % 加入噪声 Noise = normrnd(0,0.01,N,1); SourSig(:,1) = SourSig(:,1) + Noise; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 列信号矢量的共轭 Cj_SourSig = ConjQVector(SourSig); % 列向量变为横向量 R_SourSig = ColToRow(Cj_SourSig); % 四元数的两个矢量积,即信号的相关矩阵 CorR = VectorMulti(SourSig, R_SourSig); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 对每一个四元数作复表示 S_C_Q = IsoMatrix(CorR); % 复表示后的矩阵重排序,使之成为四元数矩阵的导出阵 A = AssignAgain(S_C_Q); [V,D] = eig(A); % 找到D最小的值,对应的V c = diag(D); d = min(c); e = find(c==d ); % 将复数的所有特征向量转变成四元数特征向量 QVector = FVeToQVe(V); % 取对应最小D值的四元数向量 MinQV = QVector(:,(e-1)*4+1:e*4); % 估计信号参量 % 首先得到 Uk*Uk' R_MinQV = ColToRow(MinQV); NoiseCorR = VectorMulti(MinQV, R_MinQV); % 构造搜索步长因子 x = 0.01; y = 0.5; p = 0; % 在下面的搜索中一直是先确定两个,然后再搜第三个的原则 % 搜索thita for i = -1.5:x:1.5 p = p+1; r = 0; % 搜索rou 暂时不搜索了 j = rou_1; %for j = 2.6:y:3.4 % r = r+1; s = 0; % 搜索fai k = fai_1; % for k = -0.1:y:0.8 % s = s+1; beita = beita_1; alfa = alfa_1; % 列向量 SourSig = SteerVector(N, i, j, k, beita, alfa); Cj_SourSig = ConjQVector(SourSig); % 横向量 R_SourSig = ColToRow(Cj_SourSig); % 列向量填0构造成一个方阵 [a,b] = size(SourSig); c = zeros(a,(a-1)*b); SourSig = [SourSig,c]; % 横向量填0构造成一个方阵 [a,b] = size(R_SourSig); c = zeros(b/4-1,b); R_SourSig = [R_SourSig;c]; % 开始估计 E = QuatMuti(R_SourSig, NoiseCorR); F = QuatMuti(E,SourSig); % 提出矩阵(0,0)处的四元数值 G = F(1,1:4); H(p) = 1/sum(G.^2); % 搜索三个变量时用的 %H(p,r,s) = 1/sum(G.^2); % end %end end % 将Kk次实验结果相加 K = K + H; end H = K/Kk; figure(1) plot(-1.5:x:1.5,H);